package com.wsg.dep.core;


import com.wsg.dep.exception.AlertException;
import com.wsg.dep.exception.TimeoutException;

/**
 * 用于跟踪发布者的游标（cursor）以及依赖的 EventProcessor 的序列，以处理数据结构。
 */
public interface SequenceBarrier
{
    /**
     * 等待给定的序列变得可以消费。
     * @param sequence 要等待的序列
     * @return 返回可消费的最大序列
     * @throws AlertException Disruptor 的状态发生了变化
     * @throws InterruptedException 线程在条件变量上需要被唤醒
     * @throws TimeoutException 等待指定序列时发生超时
     */
    long waitFor(long sequence) throws AlertException, InterruptedException, TimeoutException;

    /**
     * 获取当前可以读取的游标值
     * @return
     */
    long getCursor();

    /**
     * 当前的告警状态
     * @return 警报状态返回 true，否则返回 false
     */
    boolean isAlerted();

    /**
     * 通知 EventProcessor 状态发生变化，并保持此状态直到清除
     */
    void alert();

    /**
     * 清除当前状态
     */
    void clearAlert();

    /**
     * 检查是否已发出警报，如果是则抛出 AlertException
     * @throws AlertException
     */
    void checkAlert() throws AlertException;
}
